package com.yxinsur.imc.business.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.yxinsur.imc.business.domain.ImcOrder;
import com.yxinsur.imc.business.dto.*;
import com.yxinsur.imc.business.enums.OrderStepEnum;
import com.yxinsur.imc.business.excel.OrderTemplate;
import com.yxinsur.imc.business.form.*;
import com.yxinsur.imc.business.vo.*;

import java.util.List;

/**
 * 保单Service接口
 *
 * @author imc
 * @date 2021-03-18
 */
public interface IImcOrderService  extends IService<ImcOrder>
{
    /**
     * 查询保单列表
     *
     * @param searchForm 保单
     * @return 保单集合
     */
    public List<OrderVo> selectQueryOrderList(OrderSearchForm searchForm);

    /**
     * 校验保单号是否唯一
     *
     * @param policyCode 保单号
     * @return 结果
     */
    public boolean checkPolicyCodeUnique(String policyCode,Long orderId,Long tenantId);

    /**
     * 校验投保单号是否唯一
     *
     * @param proposalCode 投保单号
     * @return 结果
     */
    public boolean checkProposalCodeCodeUnique(String proposalCode,Long orderId,Long tenantId);

    /**
     * 新增保单
     *
     * @param orderData 保单
     * @return 结果
     */
    public void insureOrder(OrderDataForm orderData);

    /**
     * 修改保单
     *
     * @param orderData 保单
     * @return 结果
     */
    public void updateImcOrder(OrderDataForm orderData, OrderStepEnum orderStepEnum);

    /**
     * 新增保单险种
     *
     * @param orderId 保单ID
     * @param riskForm 保单险种数据
     * @return 结果
     */
    public void addOrderRisk(Long orderId,OrderRiskInputForm riskForm);
    /**
     * 查询保单录入列表
     *
     * @param searchForm 保单
     * @return 保单集合
     */
    public List<OrderVo> selectInputOrderList(OrderSearchForm searchForm);

    /**
     * 查询保单撤销列表
     *
     * @param searchForm 保单
     * @return 保单集合
     */
    public List<OrderVo> selectCancelOrderList(OrderSearchForm searchForm);

    /**
     * 保单撤销
     *
     * @param cancelForm 保单
     * @return 结果
     */
    public void cancelImcOrder(OrderCancelForm cancelForm);

    /**
     * 查询保单回执列表
     *
     * @param searchForm 保单
     * @return 保单集合
     */
    public List<OrderVo> selectReceiptOrderList(OrderSearchForm searchForm);

    /**
     * 保单回执
     *
     * @param receiptForm 保单
     * @return 结果
     */
    public void receiptImcOrder(OrderReceiptForm receiptForm);

    /**
     * 查询保单终止列表
     *
     * @param searchForm 保单
     * @return 保单集合
     */
    public List<OrderVo> selectEndOrderList(OrderSearchForm searchForm);

    /**
     * 保单终止
     *
     * @param endForm 保单
     * @return 结果
     */
    public void endImcOrder(OrderEndForm endForm);

    /**
     * 险种终止
     *
     * @param riskEndForm 险种
     * @return 结果
     */
    public void endImcOrderRisk(OrderRiskEndForm riskEndForm);

    /**
     * 险种豁免
     *
     * @param riskWaiverForm 险种
     * @return 结果
     */
    public void waiverImcOrderRisk(OrderRiskWaiverForm riskWaiverForm);

    /**
     * 保单数据导入
     * @param inputOrgId 录单机构ID
     * @param repoSupplierId 供应商/保险公司ID
     * @param orderList  保单数据列表
     * @param isUpdateSupport 是否更新支持，如果已存在，则进行更新数据
     * @return
     */
    public String importOrder(Long inputOrgId,Long repoSupplierId,List<OrderTemplate> orderList, Boolean isUpdateSupport);

    /**
     * 保单详情查询
     * @param orderId
     * @return
     */
    public OrderDetailVo getByOrderId(Long orderId);
    /**
     * 查询非年交模块保单列表
     *
     * @param searchForm 保单
     * @return 保单集合
     */
    public List<OrderVo> selectNonAnnualOrderList(OrderSearchForm searchForm);
    /**
     * 查询保单险种列表
     *
     * @param orderId 保单ID
     * @return 保单集合
     */
    public List<OrderRiskVo> selectOrderRiskList(Long orderId);
    /**
     * 查询续期保单险种列表
     *
     * @param searchForm 查询条件
     * @return 保单集合
     */
    public List<OrderRiskVo> selectRenewalRiskList(RenewalOrderSearchForm searchForm);
    /**
     * 查询预收报表分页列表
     *
     * @return 保单集合
     */
    public List<ReportAdvanceVo> selectAdvanceReportList(ReportAdvanceForm reportAdvanceForm);

    /**
     * 保单转移
     * @param brokerId 转给代理人ID为brokerId的人
     * @param orderIds 要转移的保单id
     * @return
     */
    public int transferOrder(Long brokerId,List<Long> orderIds);

    /**
     * 保存保单
     * @param order 保单数据
     * @return
     */
    public int receiveOrder(OrderDto order);

    /**
     * api 保单撤销
     * @param order
     */
    void ApiCancelImcOrder(OrderEndCancelSuspensionDto order);

    /**
     * api 保单终止
     * @param order
     */
    void ApiEndImcOrder(OrderEndCancelSuspensionDto order);

    /**
     * api 保单中止
     * @param order
     */
    void ApiSuspensionImcOrder(OrderEndCancelSuspensionDto order);

    /**
     * 回执，回访，告知书
     * @param order
     */
    void apiReceiptRevisitCustom(OrderReceiptRevisitCustomDto order);

    /**
     * 自保件查询
     * @param orderSelfHoldForm
     * @return
     */
    List<OrderSelfHoldVo> selfHoldList(OrderSelfHoldForm orderSelfHoldForm);

    /**
     * 标记自保件
     * @param ids
     * @param isSelf
     */
    void updateSelfHold(List<Long> ids, String isSelf);

    /**
     * 保单删除校验
     * @param orderIds
     */
    void deleteOrderCheck(Long orderIds);

    /**
     * 保单删除
     * @param orderIds
     */
    void deleteOrder(Long orderIds);

    ImcOrder selectImcOrderByOrderId(Long orderId);

    List<ReportAdvanceExportVo> advanceAllExport(ReportAdvanceForm reportAdvanceForm);
}
